package com.mintingi.pattern.templatemethod;

/**
 * 전체적인 처리 과정을 관리하고, 공통적인 중복 알고리즘은 직접 구현하며, 
 * 서브클래스마다 다른 알고리즘은 서브클래스에 의존한다.
 * 
 * @author mintingi
 *
 */
public abstract class CaffeineBeverage {

	/**
	 * 템플릿 메소드 패턴
	 */
	final void prepareRecipe() {
		boilWater();
		brew();
		pourInCup();
		if(customerWantsCondiments()) {
			addCondiments();
		}
	}
	
	/**
	 * 서브 클래스에서 처리
	 */
	abstract void brew();
	
	/**
	 * 서브 클래스에서 처리
	 */
	abstract void addCondiments();
	
	/**
	 * 이 클래스에서 처리(공통 알고리즘)
	 */
	void boilWater() {
		System.out.println("물 끊이는 중");
	}
	
	/**
	 * 이 클래스에서 처리(공통 알고리즘)
	 */
	void pourInCup() {
		System.out.println("컵에 따르는 중");
	}
	
	/**
	 * 이 메소드는 서브클래스에서 필요에 따라 오버라이드(Override)할 수 있는
	 * 메소드 이므로 후크(hook)이다.
	 * @return
	 */
	boolean customerWantsCondiments() {
		return true;
	}
}
